package com.zzz.schedule.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import java.util.concurrent.ThreadLocalRandom;
/*
 * @author zzr
 * @date: 2025/07/14  00:15
 * @description:
 */

public class JDBCUtil {

    // 用于为每个线程单独存储 Connection 对象
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    // 数据源，用于获取数据库连接
    private static DataSource dataSource;

    // 静态代码块，类加载时执行，用于初始化数据源
    static {
        Properties properties = new Properties();
        // 通过类加载器获取配置文件的输入流
        InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
        try {
            // 加载配置文件内容到 Properties 对象
            properties.load(resourceAsStream);
            // 根据配置创建 Druid 数据源
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            // 若初始化失败，抛出运行时异常
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取数据源对象
     * @return 数据源 DataSource
     */
    public static DataSource getDataSource() {
        return dataSource;
    }

    /**
     * 获取数据库连接，优先从 ThreadLocal 中获取，若不存在则从数据源创建并放入 ThreadLocal
     * @return 数据库连接 Connection
     */
    public static Connection getConnection() {
        Connection connection = threadLocal.get();
        if (null == connection) {
            try {
                // 从数据源获取新连接
                connection = dataSource.getConnection();
            } catch (SQLException e) {
                // 获取连接失败时抛出运行时异常
                throw new RuntimeException(e);
            }
            // 将新创建的连接放入 ThreadLocal，供当前线程后续使用
            threadLocal.set(connection);
        }
        return connection;
    }

    /**
     * 释放连接，移除 ThreadLocal 中的连接，并将连接恢复自动提交后归还到连接池
     */
    public static void releaseConnection() {
        Connection connection = threadLocal.get();
        if (null != connection) {
            // 从 ThreadLocal 中移除连接，避免线程复用导致问题
            threadLocal.remove();
            try {
                // 将连接恢复为自动提交模式
                connection.setAutoCommit(true);
                // 将连接关闭（ Druid 连接池会回收连接，并非真正关闭物理连接 ）
                connection.close();
            } catch (SQLException e) {
                // 处理连接关闭过程中的异常
                throw new RuntimeException(e);
            }
        }
    }
}